package com.hk.service.order;

import com.hk.commons.HqlFilter;
import com.hk.commons.entity.order.OrderInfo;

import java.math.BigDecimal;
import java.sql.Timestamp;
import java.util.List;

public interface ITradeInfo {
	public OrderInfo findById(long id);

	/**
	 * 保存
	 * 
	 * @param
	 * @return
	 */
	public Long add(OrderInfo u);

	/**
	 * 删除
	 * 
	 * @param
	 * @return
	 */
	public void delete(OrderInfo u);
	
	/**
	 * 判断某一个用户是否能够购买某一款产品
	 * @return
	 */
	
	public Boolean check(Long userId, Long productId);
	/**
	 * 更新
	 * 
	 * @param
	 */
	public void update(OrderInfo u);

	public List<OrderInfo> findByFilter(HqlFilter hqlFilter, int pageNum,
                                        int pageSize);

	public List<OrderInfo> findByFilter(HqlFilter hqlFilter);

	public Long countByFilter(HqlFilter hqlFilter);

	/**
	 * 产品开始计息
	 * 
	 * @param productId
	 * @return
	 */
	public Boolean startDiv(Long productId, Timestamp tradeTime,
                            Timestamp divEndTime);
	
	
	/**
	 * 产品开始回款
	 * @param productId
	 * @return
	 */
	public Boolean startPayBack(Long productId);

	/**
	 * 根据信息初始化订单
	 * 
	 * @param orderId
	 * @param userId
	 * @param productId
	 * @param amount
	 * @return
	 */
	public OrderInfo initOrder(Long orderId, Long userId, Long productId,
                               Long userCardId, BigDecimal amount);

	/**
	 * 将需要划拨的信息存入redis中
	 * @param orderId
	 * @param outAccount
	 * @param inAccount
	 * @param amt
	 */
	public void addTransferOrderIntoRedis(Long orderId, String contractNo, String outAccount, String inAccount, BigDecimal amt);
		
 
	/**
	 * 将待回款的订单放入redis中
	 * @param orderId
	 * @param outAccount
	 * @param inAccount
	 * @param amt
	 */
	public void addPaybackOrderIntoRedis(Long orderId, String outAccount, String inAccount, BigDecimal amt);
	
	/**
	 * 从redis 中获取订单信息
	 * 
	 * @param key
	 * @return
	 */
	public OrderInfo getOrderFromRedis(String key);

	/**
	 * 从redis 中删除订单信息
	 * 
	 * @param key
	 * @return
	 */
	public void delOrderFromRedis(String key);

	/**
	 * 更改订单的状态
	 * 
	 * @param
	 * @param payStatus
	 * @param confirmStatus
	 */
	public OrderInfo updateAndSaveOrder(OrderInfo orderInfo, Integer payStatus,
                                        Integer confirmStatus);

	public List<OrderInfo> findPayBackOrders(int confirmStatus, int payStatus,
                                             Long paymentId);

	/**
	 * 获取刚起标的订单信息
	 * 
	 * @return
	 */
	public List<OrderInfo> getProdNewStartOrders();
	
	/**
	 * 根据 userId 获取总的投资金额
	 * @param userId
	 * @return
	 */
	public BigDecimal getTotalPayAmt(Long userId);
}
